package com.config;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScans;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.thymeleaf.spring5.SpringTemplateEngine;
import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring5.view.ThymeleafViewResolver;
import org.thymeleaf.templateresolver.ITemplateResolver;

@EnableWebMvc
@ComponentScan("com.controller")
@Configuration
@ComponentScans({
        @ComponentScan("com.service"),
        @ComponentScan("com.service.impl"),
        @ComponentScan("com.controller")
})
@MapperScan("com.mapper")
public class WebConfiguration implements WebMvcConfigurer {
    /**
     * 自定义视图解析器
     *
     * @return
     */
    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/");
        resolver.setSuffix(".jsp");
        return resolver;
    }

    /**
     * 注册一个默认的Handler：DefaultServletHttpRequestHandler，这个Handler也是用来处理静态文件的，
     * 它会尝试映射/*。当DispatcherServelt映射/时（/ 和/** 是有区别的），
     * 并且没有找到合适的Handler来处理请求时，就会交给DefaultServletHttpRequestHandler来处理。
     * 注意：这里的静态资源是放置在web根目录下，而非WEB-INF 下。
     * 可能这里的描述有点不好懂，所以简单举个例子。例如：在webroot目录下有一个图片：1.png
     * 我们知道Servelt规范中web根目录（webroot）下的文件可以直接访问的，但是由于DispatcherServlet配置了映射路径是：/
     * ，它几乎把所有的请求都拦截了，从而导致1.png 访问不到，这时注册一个DefaultServletHttpRequestHandler
     * 就可以解决这个问题。其实可以理解为DispatcherServlet破坏了Servlet的一个特性（根目录下的文件可以直接访问），
     * DefaultServletHttpRequestHandler是帮助回归这个特性的。
     * <p>
     * 题外话
     * 问：　/和/*　有什么区别？
     * 答： /会拦截除了jsp以外的所有url，/* 会拦截所有url，包括jsp。
     * 例如：在webroot下面有一个test.jsp,当DispatcherServlet 配置映射/ 时，
     * 浏览器输入：http://localhost:8080/test.jsp 这个jsp是可以直接访问的，并且不经过DispatcherServlet ，
     * 而当DispatcherServlet 配置映射/* 时，这个请求就会被DispatcherServlet 拦截。
     */
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
//
//    //我们需要使用ThymeleafViewResolver作为视图解析器，并解析我们的HTML页面
//    @Bean
//    public ThymeleafViewResolver thymeleafViewResolver(@Autowired SpringTemplateEngine springTemplateEngine){
//        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
//        resolver.setOrder(1);   //可以存在多个视图解析器，并且可以为他们设定解析顺序
//        resolver.setCharacterEncoding("UTF-8");   //编码格式是重中之重
//        resolver.setTemplateEngine(springTemplateEngine);   //和之前JavaWeb阶段一样，需要使用模板引擎进行解析，所以这里也需要设定一下模板引擎
//        return resolver;
//    }
//
//    //配置模板解析器
//    @Bean
//    public SpringResourceTemplateResolver templateResolver(){
//        SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
//        resolver.setSuffix(".html");   //需要解析的后缀名称
//        resolver.setPrefix("/");   //需要解析的JSP页面文件存放的位置
//        return resolver;
//    }
    //配置模板引擎Bean
//    @Bean
//    public SpringTemplateEngine springTemplateEngine(@Autowired ITemplateResolver resolver){
//        SpringTemplateEngine engine = new SpringTemplateEngine();
//        engine.setTemplateResolver(resolver);   //模板解析器，默认即可
//        return engine;
//    }

    /**
     * 配置静态资源的访问路径
     *
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //此表示在webapp/WEB-INF/resources/路径下
        registry.addResourceHandler("/resources/**").addResourceLocations("/WEB-INF/resources/");
    }
}
